SECTION MBR vstart=0x7c00
    mov ax, cs  ; 此时 cs 为0
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov fs, ax
    mov sp, 0x7c00  ; 栈从高往低长，此时0x7c00 以上是MBR的代码，不能被覆盖
    mov ax, 0xb800  ; 0xb800: 显存地址范围为 0xB8000 到 0xBFFFF
    mov gs, ax      ; gs 为显存专用的段寄存器

    ; 清屏
    ; 使用 0x06 号功能，上卷全部行，可清屏
    ; INT 0x10 功能号，0x06 功能描述：上卷窗口
    ; -------------------------
    ; input
    ; AH 功能号=0x06
    ; AL = 上卷行数，0表示全部上卷
    ; BH = 上卷行属性
    ; (CL,CH) 窗口左上角 (X,Y) 位置
    ; (DL,DH) 窗口右下角 (X,Y) 位置
    ; output: void
    mov ax, 0600h   ; 0600h 与 0x0600 是一样的
    mov bx, 0700h
    mov cx, 0   ; 左上 (0,0)
    mov dx, 184fh   ; 右下(80,25), VGA 文本模式只能容纳80*25，且下标从0开始，
                    ; 所以 0x18 = 25-1, 0x4f=80-1
    int 10h     ; BIOS中断。注意，此时 BIOS 的中断向量表没有被覆盖，所以可以接着用

    ; 输出
    ; 输出背景绿色，前景红色，并打印跳动的字符串 "1 MBR"
    mov byte [gs:0x00], '1' ; byte 类似于 C 的类型转换，表示读取的字长；word表示2字节；dword 表示4字节
                            ; 立即数'1'无法判断其存储空间，所以需要显式指定
    mov byte [gs:0x01], 0xA4; A 表示绿背景色且字符闪烁，4表示前景色为红色，且第4位0表示一般亮度，不高亮
    
    mov byte [gs:0x02], ' ' ; 目前仍处理实模式下，所以用段基址方式访问内存
    mov byte [gs:0x03],0xA4 ; 对于CPU来说，访问内存时默认是 ds，用 gs 与用其它寄存器作用是一样的
                            ; 除 ds 不需要指明外，使用其它寄存器均需要显式给出，这个寄存器使用叫做
                            ; "段跨越"前缀
    mov byte [gs:0x04], 'M'
    mov byte [gs:0x05],0xA4

    mov byte [gs:0x06], 'B'
    mov byte [gs:0x07],0xA4

    mov byte [gs:0x08], 'R'
    mov byte [gs:0x09],0xA4

    jmp $   ; while true

    times 510-($-$$) db 0   ; 填满512字节，对齐 MBR 大小要求
    db 0x55,0xaa    ; MBR 以 0x55/0xaa 结尾才能被识别